'use strict';
const path = require('path');

// 引入格式化时间模块
const sd = require('silly-datetime');

// 引入模块智能生成上传文件夹
const mkdirp = require('mkdirp');

// 引入生成缩略图的模块
const Jimp = require('jimp');

// 发邮件包
const nodemailer = require('nodemailer');

// 阿里发短信包
const Core = require('@alicloud/pop-core');

module.exports = {

  /**
   *
   * @param {string} message 成功提示消息
   * @param {null} data 返回数据
   */
  success(message = 'success', data = null) {
    this.ctx.status = 200;
    this.ctx.body = {
      code: 0,
      message,
      data,
    };
  },

  /**
 *
 * @param {string} message 错误提示消息
 * @param {number} status 服务器状态码
 * @param {Array} data 数据
 */
  error(message = 'error', status = 500, data = null) {
    this.ctx.status = status;
    this.ctx.body = {
      code: 1,
      message,
      data,
    };
  },


  /**
   *
   * @param {number} length 生成*位随机数 默认为6位
   */
  rand(length = 6) {
    let Num = '';
    for (let i = 0; i < length; i++) {
      Num += Math.floor(Math.random() * 10);
    }
    return Num;
  },

  /**
   * 发邮件
   * @param {Object} mailOptions 对象
   */
  sendEmail(mailOptions) {
    const transporter = nodemailer.createTransport(this.app.config.qqEmail);
    transporter.sendMail(mailOptions, function(error, info) {
      if (error) {
        console.log(error);
        return error;
      }
    });
  },

  /**
   * 发短信
   * @param {number} mobile 手机号码
   */
  sendMobile(mobile) {
    const client = new Core(this.app.config.aliSms);

    const params = {
      PhoneNumbers: mobile, // 接收短信的手机号码
      SignName: '通用验证码', // 短信签名名称
      TemplateCode: 'SMS_238156787', // 短信模板CODE
    };

    const requestOption = {
      method: 'POST',
    };

    client.request('SendSms', params, requestOption).then(result => {
      console.log('result', JSON.stringify(result));
    }, ex => {
      console.log('ex', ex);
      return ex;
    });

  },

  /**
   *
   * @param {Objct} options token配置项
   * @return 生成token
   */
  getToken(options) {
    return this.app.jwt.sign(options, this.app.config.jwt.secret, this.app.config.jwt.expiresIn);
  },
  /**
   *
   * @param {Objct} options refreshToken配置项
   * @return 生成refreshToke
   */
  getRefreshToken(options) {
    return this.app.jwt.sign(options, this.app.config.jwt.secret_refresh, this.app.config.jwt.expiresIn);
  },

  /**
   *
   * @param {*} filename
   * @return 获取文件 上传目录
   */
  async getUploadFile(filename) {
    // 1、获取当前日期     20301024
    const day = sd.format(new Date(), 'YYYYMMDD');
    // 2、创建图片保存的路径 将存放地址与日期进行拼接）
    const dir = path.join(this.config.uploadDir, day);
    await mkdirp(dir); // 按dir去创建文件夹，如果没有则生成，如果有则忽略
    const date = Date.now(); /* 毫秒数*/// 获取当前时间戳
    // 返回图片保存的路径 (文件夹 + 时间戳 + 后辍名)
    const uploadDir = path.join(dir, date + path.extname(filename));
    // app\public\admin\upload\20301024\1536895331444.png
    return {
      // 上传的地址
      uploadDir,
      // 保存在数据库的地址
      saveDir: this.ctx.origin + uploadDir.slice(3).replace(/\\/g, '/'),
    };
  },

  /**
   * 生成缩略图方法
   * @param {*} target
   */
  async jimpImg(target) {
    Jimp.read(target, (err, lenna) => {
      if (err) throw err;
      // 生成200乘以200大小，品质为90，并重命名文件
      lenna.resize(200, 200).quality(90).write(target + '_200x200' + path.extname(target));
    });

  },
  /**
   *
   * @param {数据} data
   * @return 转化tree树型数据
   */
  toTree(data) {
    // 删除 所有 children,以防止多次调用
    data.forEach(function(item) {
      delete item.children;
    });

    // 将数据存储为 以 id 为 KEY 的 map 索引数据列
    const map = {};
    data.forEach(function(item) {
      map[item.id] = item;
    });
    //        console.log(map);
    const val = [];
    data.forEach(function(item) {
      // 以当前遍历项，的pid,去map对象中找到索引的id
      const parent = map[item.parentId];
      // 好绕啊，如果找到索引，那么说明此项不在顶级当中,那么需要把此项添加到，他对应的父级中
      if (parent) {
        (parent.children || (parent.children = [])).push(item);
      } else {
        // 如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中，作为顶级
        val.push(item);
      }
    });
    return val;
  },

  /**
   *校验手机号
   * @param {Number} str 要验证的手机号码
   * @return Boolean
   */
  validMobile(str) {
    return /^1[3-9]\d{9}$/.test(str);
  },

  /**
   * 校验邮箱
   * @param {String} str 要验证的邮箱
   * @return Boolean
   */
  validEmail(str) {
    return /^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/.test(str);
  },

  /**
   * 验证密码(密码只能由数字和字母组成)
   * @param {String} str 要验证的密码
   * @return Boolean
   */
  validPassword(str) {
    return /^[0-9A-Za-z]+$/.test(str);
  },


  /**
   *
   * @param {string} password
   * @param {string} paypassword
   * @return 加密密码 和 支付密码 函数
   */
  encryption(password, paypassword) {
    // const password = this.ctx.request.body.password;
    // const paypassword = this.ctx.request.body.paypassword;
    try {
      if (password) {
        return this.ctx.genHash(password);
      }
      if (paypassword) {
        return this.ctx.genHash(paypassword);
      }
    } catch (error) {
      console.error('密码/支付密码加密辅助函数出错', error);
    }
  },


};
